WICS Ver1.1 ――――――――――――――――――――――――――――――――――――――― I/O 1981年 9、10月号掲載 MZ−80 マシン語 01200H−0314EH S:01200H 起動方法 モニタからロード ――――――――――――――――――――――――――――――――――――――― 現在ではほとんどのマイクロコンピュータに BASIC言語が備わっており、 数値計算には非常に便利なのですが、 一般的に言ってBASICは制御プログラムや グラフィックス処理などの 高速さを要求される仕事には不向きです。 通常ならば、そのような仕事に対しては、 アセンブラなどでプログラムを開発していたのですが、 プログラムの内容が複雑になるにつれて アセンブラによる開発は困難になってきます。 そのような用途のために、私たちは速度とメモり効率の点で、 アセンブラ(=機械語)にひけをとらないくらいに 効率のよいZ80コンパイラと、 それと同じ文法のインタープリタとの複合システム(WICS)を 開発しました。   ・−−−−−−−−−−−−−−・  /   なぜWICSなのか    \ ・−−−−−−−−−−−−−−−−−−・ 普通、私たちがコンピュータに何か複雑な仕事をやらせる場合、 コンピュータにプログラムを与えることが必要になります。 ところで、コンピュータが直接実行してくれるプログラムは、 必ずそのコンピュータの機械語で書かれているものだけです。 その機械語というのは、人間には ほとんど理解し難い数字(+A〜F)の羅列にしか過ぎないものです。 これでは、どうにもならないので、 その機械語の意味が少しは連想できそうな 適当な単語(ニモニックと呼ぶ)に置き替えたものがアセンブリ言語です。 アセンフリ言語(アセンブラとも言う)は、 コンピュータのハードウェア(CPU)に密着したものなので、 CPUが異なれば当然異なり、普遍的なものではありません。 そこで、もっと人間にとって理解しやすい言語でプログラムを書いて、 それを機械語に変換させよう、 というのがコンパイラ(翻訳系)の考え方です。 ところで、BASICというに言語が普及していますが、 BASICはほとんどがコンパイラではなく、 インタープリ夕(解釈実行系)です。 BASICは最近流行のPASCALのような構造言語から見れば、 幼稚な言語ですが、その母体であるFORTRANとも似ていし、 初心者にもわかりやすい言語です。 インタープリタはプログラムの作成や実行、 デバッグが非常にやり易いのですが、 その反面、プログラムの実行速度が機械語に比べ はるかに遅くなるという欠点があります。 それもそのはず、インタープリタはその名のごとく、 人間の、書いたプログラムを毎回読みながら それを解釈して実行しているからです。 では、BASICインタープリタで書かれたプログラムを コンパイラにかけて機械語にしてしまってはどうでしょうか。 フログラムの作成とデバッグはインタープりタで行ない、 完成したプログラムをコンパイルすれば、 プログラムの開発は非常に楽になります。 ところで、マイコンではBASICのコンパイラは あまり一般には使われていません。 実数系まで扱うとなるとコンパイラ自体かかなり巨大になり、 テキストやオブジェクトを補助記憶に出し入れしなければならなくなる、 というのも理由の一つですが、 8ビットCPUにとって、実数演算は苦手でかなり処理時間がかかるため、 コンパイルできたとしてもあまり画期的な速度の向上は望めないからです。 また、マイコンを数値計算に使うだけであれば、 インタープリタがいくら遅いといってもプログラム電卓よりは、 はるかに速いし、数値計算の揚合は、 計算が終るまで人間の方が待っていればよいのです。 ところが、マイコンというものは、もっと応用分野の広いものであり、 速度を要求される制御関係や リアルタイム・ジョブ(TVゲームのことかな?)に使おうとすれば、 処理速度が遅くては、使いものにならないのです。 そこで、BASICの使いやすさは捨てずに、 (インタープリタ・モードを持たせる)アセンブラに ひけをとらないくらいのコンパイラを実現しようとしたのが、 このWICSなのです。   ・−−−−−−−−−−−−−−・  /    開発にあたって     \ ・−−−−−−−−−−−−−−−−−−・ 言語の開発では、まず文法を決めるのが先ですが、 大まかに、言えば、WICSはBASIC文法に ハードウェア制御用やメモり操作に便利なコマンドなどを付け加え、 その代り実数演算機能は省いています。 さらに、コンパイラを記述しやすいように再帰呼出し可能にして、 コンパイラはWICS自身で記述することとしました。 また、インタープリタは自己記述は少し無理なので、 BASEアセンブラ(文献1)で記述しています。   ・−−−−−−−−−−−−−−・  /    システムの概略     \ ・−−−−−−−−−−−−−−−−−−・ WICSは大きく分けて、インタープリタ、コンパイラ、 マシン語モニタを含んだランタイム・パッケージの3つの部分に分かれています。 ランタイム・パッケージはメモリ常駐になっており、 インタープリタとコンパイラ、それにユーザーの作制した コンパイル・オブジェクトはすべてこのパッケージに依存します。 WICSでのプログラム開発形態は、 かなりユーザーの自由になっていますが、 次のようなものが考えられます。  I)インタープリタのみによる開発。   WICSインタープリタ(もちろんランタイム・パッケージを含む)のみを   用いてプログラムを作る場合です。   これは通常のBASICインタプリタを使うのとほとんど同じ感覚です。   実数演算はありませんが、実数型のBASICにくらべ   2〜3倍の速さを持っています。   また、WICSテキスト・プログラムはメモリが許せば、   いくつでも置くことができます。(TEXT命令で切り換えて使用)  II)インタープリタとコンパイラを両方使う場合。   インタープリタとコンパイラはメモリ上に共存できるので、   両方ともメモリにロードしておいて、   インタープリタでプログラムを編集、デバッグして、   即、コンバイラにかけることができます。   また、コンパイルされたサブルーチンは、   インタープリタからコールすることも自由にできます。   このとき、サブルーチン内の変数名とインタープリタで使う変数名が   重複しても問題はありません。   サブルーチンヘの引数渡しはPUSH、POP命令で行なうか、   あるいはメモリのフリー・エリアに共通の配列をとって行なえます。   マシン語とのリンクも自由にできます   (ただし、インデックス・レジス夕はIX、IYともに    ソフトウェア・スタックなので、破壊してはいけません)。  III)インタープリタを切り離す場合。   ユーザー・プログラムが大きくなって、   ユーザー・プログラムのオブジェトを作る場所がなくなったときは、   インタープリタを切り離して、インタープリタ本体のメモリ領域を、   オブジェクト生成に使うこともできます。   また、インタープリタ本体の代わりに、そこにユーザ・オブジェクトを置き、   ランタイム・パッケージと共にセーブすれば、   完全独立型オブジェクトを作ることもできます。   いずれの場合もインタープリタを切り離すと   テキスト・プログラムの編集はできなくなります。   特筆すべきことは、コンパイラがかなりのレベルまで   オブジェクトの最適化(生成コードの縮小と高速化)を行なうため、   ソース対オブジェクト比が1対0.6〜0.8程度にまで縮まり、   実行速度は1桁以上向上することです。   また、コンパイル速度は、約400行/分と高速です。   ・−−−−−−−−−−−−−−・  /     文法上の特徴     \ ・−−−−−−−−−−−−−−−−−−・ WICSの文法はBASICとかなり似ています。 なぜ、BASICの構造を選んだかという問いに対しては、 BASICの文法が広く普及している、ということのほかに、 BASICの制御構造が、機械語で比較的実現しやすい、 ということが言えます。 このことは、生成されるオブジェクトの効率を良くすることにもなります。 もしも、PASCALなどの言語構造を使うと、 ローカル変数の割り当てや手続き呼び出しの引数機構のために、 かなりのオーバー・ヘッドが生じてしまいます。 ただし、BASIC文法と異なる部分も多少あります。 というのは、 (1)変数名は英字(アルファベット)で始まる   英数字(A〜Zと0〜9)からなる任意長で、   予約語(FORやGOSUBなど)で始まるものでなければ、   すべての文字を識別します。   すなわち、“HENSU”という名前の変数と、   “HENSU1”という名前の変数は区別して扱かわれます。 (2)配列はBASICの配列と異なっていて、   ユーザーがメモリのフリー・エリアに指定する形式で、   1バイト配列と2バイト配列かあります。   いずれも配列の要素はメモリ番地と直接対応しているので、   メモリ操作ポインタとして使うこともできます   (機械語におけるインデックス・アドレッシングの考え方に似ています)。 (3)ダブル・クォーテーションで囲まれた1文字は、   文字定数として、整数値(そのASCIIコード)に変換されます。 (4)演算子にOR、AND、XORがあり、   これによりビット操作を可能にします。 (5)その他、再帰呼び出しを可能にする   PUSH、POP命令があり、   FOR〜NEXTやGOSUB〜RETURNとは   別の独立のスタックを持たせているので、   引数をPUSHしたあとでサブルーチンをコールする方法が使えます。   (文法上の注意) (1)GOTO、GOSUBの飛び先行番号は必ず定数でなくてはいけません。 (2)ただし、マシン語を呼び出すCALLでは、番地の代りに   式や名前(変数)も使えます。 (3)FORに対するNEXTはコンパイラにかけることを考えて、   必ず1対1で対応させること。   ネスティングは可能(スタックの許す限り)ですが、   途中からの飛び出しや飛び込みはコンパイラで走らせる場合、   暴走の原因、非構造化の始まりになります。   (WICSの扱える数値および変数) (1)変数  ●変数は英宇(A〜Z)で始まり、英数字(A〜Z、0〜9)から成る   任意の文字列です。  ●変数名の長さに制限はありません.   また、変数名は全文字を識別します。  ●ただし、予約語(FORやGOSUBなど)で始まる文字列は   変数とはみなしません。   予約語が変数名の途中から現われる場合はかまいません   (変数名とみなす)。  ●変数は−32768〜32767までの整数値をとることができます。 (2)配列(INDEX)  ●配列は、通常のBASICのDIM文と異なり、   ユーザーがメモリのフリー・エリア上に指定するようになっています。  ●2バイト配列:変数名(式)   2バイト配列は(変数の内容+式の値*2)の   メモリ番地の2バイト分の値に対応します。  ●1バイト配列:変数名〔式〕   1バイト配列は、(変数の内容+式の値)の   メモリ番地の1バイトの値に対応します。 WICSでは配列(INDEX)というのは 機械語のインデックス・アドレッシングに相当するもので、 直接的にメモリを操作できます。 (3)定数    i )10進定数:−32768〜32767の範囲の整数。   ii )16進定数:$0000〜$FFFF      (16進数は“$”をはじめに付ける)。   iii )文字定数 :“A”のように、クォーテーション『”』で      くくられた1文字のASCIIコード(整数値に変換される)。 (4)式  〈式〉:=〈項〉 〔〈演算子〉〈項〉〕   式は、項と2項演算子より成り立っています。  ●2項演算了を、優先順位の低い順に示します。   1)不等号、等号:>=、=>、<=、=<、=、<>、<、>   2)加減算   :+、−、OR   3)乗除算   :*、/、AND、XOR  ●( )を含む場合は、( )の中が最優先されます。  ●等号、不等号演算子は、左項<演算子><右項が成立すれば、   その値は1(真)で不成立の場合は、0(偽)の値をとります。  ●OR、AND、XORは、左項と右項の値を16ビットの2進数値とみなして、   各ビットごとに、OR、AND、XORをそれぞれ行ない、   16ビットにまとめて値にするものです。  予約されているコマンド、ステートメント,ファンクション表 《コマンド》 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |MON                                  | |  ●モニタに制御を移します。                      | |                                     | |BYE                                  | |  ●MZ−80のROMモニタに戻ります。                | |                                     | |RUN〔〈行番号〉〕                           | |  ●インタープリタ・モードでプログラムを実行し             | |   ます。                               | |  ●行番号を省略すると変数テーブルを、クリアして、           | |   プログラムを初めから実行します。                  | |                                     | |LIST〔〈行番号〉〕,〕〔行番号〉〕                  | |  ●テキスト・プログラムを表示します。                 | |  ●リスト行を何行目から何行目まで、という指定もできます。       | |                                     | |DELETE〈行番号〉,〈行番号〉                    | |  ●指定された範囲の行を削除します。                  | |                                     | |VLIST                                | |  ●インタープリタ・モードで使用された変数の名前と           | |   その値をすべて表示します。                     | |                                     | |NEW                                  | |  ●プログラムをすべて消去します。                   | |                                     | |LOAD〔”〈ファイル名〉”〕                      | |  ●カセット・テープからテキスト・プログラムを             | |   現在のテキスト・エリアにロードします。               | |  ●ファイル名を省略すれば、最初にあったプログラムを          | |   ロードします。                           | |                                     | |SAVE 〔”〈ファイル名〉”〕                     | |  ●LOADの逆でテキス卜・エリアにある“WICS”の         | |   テキスト・プログラムをカセットにセーブします。           | |                                     | |VERIFY〔”〈ファイル名〉”〕                    | |  ●カセットに記録された“WICS”テキストを             | |   テキスト・エリアにあるプログラムと比較します。           | |  ●ファイル名を省略すると最初に見つけた                | |   プログラムとの比較をします。                    | |                                     | |APPEND〔“〈ファイル名〉”〕                    | |  ●カセットに記録された“WICS”テキストを             | |   現在のテキスト・エリア上のプログラムの後に             | |   つづけでロードします。                       | |  ●APPENDでは行番号はそのままですので              | |   注意してください。                         | |                                     | |SYSTEM                               | |  ●現在のテキスト・エリアの先頭、終了、上限の番地を          | |   それぞれ表示します。                        | |                                     | |LIMIT〈番地〉                            | |  ●テキスト・エリアの上限を設定します。                | |  ●通常は$C000番地になっています。                | |                                     | |TEXT〈番地〉                             | |  ●テキス上・エリアの先頭番地を設定します。              | |  ●同時に終了番地は自動セットされます。                | |                                     | |CLR                                  | |  ●インタープリタで使う変数表をクリアします。             | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ ※以上がインタープリタのコマンドです。  これらはダイレクト・モード、  テキスト・プログラム中いずれでも使えますが、  コンパイラは無視するので注意してください。 《ステートメント》 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |IF〈式〉THEN〈文〉                         | |  ●式の値か真(0以外の値はすべて真とみなす)             | |   のときTHEN以下の文を実行します。                | |  ●THENは省略できます。                      | |                                     | |・−FOR〈変数〉=〈初朗値〉TO〈最終値〉〔STEP〈変化幅〉〕    | || 〈繰り返すプログラム〉                        | |・−NEXT〔〈変数〉〕                         | |  ●BASICと同じ繰り止し命令です。                 | |  ●STEPが1のときは、STEP文は省略できます。          | |  ●ただし、STEP値は正の値でなければいけません。          | |                                     | |・−REPEAT                             | || 〈繰り返すプログラム〉                        | |・−UNTIL〈式〉                           | |  ●式の値か真になるまで、REPEATとUNTILに          | |   はさまれたプログラムを繰返し実行します。              | |                                     | |0N〈式〉GOTO〈行番号1〉,〈行番号2〉,…〈行番号N〉       | |  ●式の値が1であれば行番号番1へ、                  | |   2であれば行番号2へというように                  | |   式の値の数にある行番号へ飛びます。                 | |   ただし、その値に該当する行番号が書れていないときは、        | |   分岐せすに次の命令へ行きます。                   | |                                     | |ON〈式〉GOSUB前項と同じ                      | |  ●ON〜GOTOと同じように式の値の番目にある行番号番号を      | |   サブルーチン・コールします。                    | |                                     | |GOTO〈行番号〉                            | |  ●行番号に分岐します。                        | |                                     | |GOSUB〈行番号〉                           | |  ●行番号をサブルーチン・コールします。                | |                                     | |RETURN                               | |  ●サブルーチンの終りを示します。                   | |  ●RETURNを実行すると、GOSUBでコールした          | |   プログラム(サブルーチンの呼び主)のGOSUB文の次へ       | |   戻ります。                             | |                                     | |REM                                  | |  ●コメント行です。REMのあとの文字は実行されません。        | |  ●’(シングルクォーテーション)もREMと同じように使えます。    | |                                     | |PRINT                                | |  ●文字や数値を出力装置に出力します。                 | |   出力装置は、通常は、ディスプレイが指定されます。          | |  ●書式は、次のようなものかあります。                 | |   (1)/〈スラッシュ:改行を行なう。                 | |   (2)“文字列”:文字列を出力。                   | |   (3)式    :式の値を定められた文字、スペースで         | |           右づめ出力する。                  | |   (4)#2式  :式の値を16進2桁で出力する。           | |   (5)#4式  :式の値を16進4桁で出力する。           | |   (6)&式   :式の値のASCII文字を出力する(1文字)。    | |   (7)!式   :式で示めされる番地に格納されている文字列を     | |           $0Dまで出力する。                | |   (8)%式   :文字スペースを式の値に定める。           | |   (9)+式   :式の値を0〜65535までの10進数で       | |           (負の扱いをしないで)出力する。          | |  以上の書式は“,”(コンマ)で区切れば、               | |  いくつでも並べることか出来ます。                   | |  注:文字スペースは、次のようになります。               | |    PRINT %5,100                     | |     100                             | |    |___|                            | |     5文字                             | |                                     | |  注:PRINT文は、最後に改行を行ないませんので、          | |    改行したいときのみ、“/”(スラッシュ)を            | |    入れて下さい。                          | |  注:%(10進出力のフォーマット)は、                 | |    次の“%”が来るまで有効です。                  | |                                     | |INPUT〈変数名〉〔,〈変数名〉…〕                  | |  ●キーボードから数字を入力して、変数に代入していきます。       | |   数字は10進、および16進(“$”をはじめに入力)可能です。    | |  ●“WICS”では文字列に対してBASICとは違う          | |   取り扱いをしているので、文字変数がありません。           | |   したがって、INPUT A$なとはできないので           | |   注意してください。                         | |   (このような場合には、LINPUTを使います。)          | |                                     | |STOP                                 | |  ●プログラムの実行を中止して、中止され行番号を表示します。      | |                                     | |END                                  | |  ●プログラムの実行を終ります。                    | |                                     | |CALL〈式〉                              | |  ●式の値の番地にあるマシン語サブルーチンをコールします。       | |                                     | |PUSH〈式〉〔,〈式〉…〕                       | |  式の値を順次、スタックに積みます。                  | |                                     | |POP〈変数名〉〔,〈式〉…〕                      | |  ●スタックに積まれた値をおろし、順次、変数に代入します。       | |                                     | |0UT〈I/O番地〉,〈式〉                       | |  ●I/O番地に式の値を出力します。                  | |  ●どちらも0〜255までの値です。                  | |                                     | |CURSOR〈式1〉,〈式2〉                      | |  ●CRTのカーソルX,Yの座標を式1と式2で指            | |   定します。                             | |                                     | |POKE〈式1〉,〈式2〉                        | |  ●式1のアドレスに式2の値の下位バイトが代入されます。        | |                                     | |CURH〈式〉                              | |  ●式の値をカーソルのX座標とします。                 | |                                     | |CURV〈式〉                              | |  ●式の値をカーソルのY座標とします。                 | |                                     | |PLOT〈式X〉,〈式Y〉,〈式M〉                   | |  ●式XをXの座標(0〜79)、式YをY座標(0〜49)とし、     | |   式MのMODEで、ドットをプロットします。             | |    MODE=0トットをりセットします。               | |    MODE=1ドットをセットします。                | |    MODE=2ドットをリバースします。               | |                                     | |LINPUT〈式〉                            | |  ●1行入力を行ない、入力された行の文字を               | |   式で指定されるアドレスを行バッファとして、その           | |   そのアドレスに1行分の文字を格納します。また、           | |   文字列の最後には終了コードとして$0Dを格納します。        | |                                     | |STA$〔〈式〉,〈“文字列”〉〕                    | |  ●式のアドレスに文字列をASCIIコードで格納します。        | |                                     | |SPOKE〈式X〉,〈式Y〉,〈式Z〉                  | |  ●CRT上の(X,Y)の座標にZのキャラクタを書きます。       | |   式Xは、0〜39、式Yは、0〜255までです。           | |   式Zは、ディスプレイ・コードです。                 | |                                     | |LINE〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉,〈式M〉       | |  ●(X,Y)の座標を始点、(X1,Y1)の座標            | |   を終点としMのMODE(PLOT参照)で、             | |   ドットで線を引きます。                       | |                                     | |PUT@〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉,〈式A〉       | |  ●CRT上の(X,Y)と(X1,Y1)を頂点とする          | |   長方形の中に、式Aで指定されるアドレスの配列を           | |   ディスプレイ・コードで表示します。                 | |                                     | |GET@〈式X〉,〈式Y〉,〈式X1〉,〈式Y1〉,〈式A〉       | |  ●PUT@と逆の動作をします。                    | |   CRT上の(X、Y)と(X1,Y1)を頂点とする          | |   長方形の中のディスプレイ・コードを式Aで指定する          | |   アドレスの配列に格納します。                    | |                                     | |BELL                                 | |  ●ベルを嗚らす。                           | |                                     | |MUSIC〈“音楽データ”〉                       | |  ●音楽データを演奏します(BASIC SP−5030の仕様と同じ)。 | |                                     | |SOUND〈式〉                             | |  ●式の文周比の音を出力します。                    | |                                     | |TEMPO〈式〉                             | |  ●MUSIC文の演奏スピードを指定します。              | |                                     | |PRMODE〈式〉                            | |  ●PRINT出力の機器を指定します。                 | |   0:CRTのみ出力。                        | |   1:PRINTERのみ出力。                    | |   2:CRT、PRINTER同時出力。                | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ 《ファンクション》 ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ |GET                                  | |  ●キー入力が行なわれるまでカーソルを点滅し、             | |   キー入力を行なったときそのASCIIコードを値とします。      | |                                     | |INKEY                                | |  ●リアルタイム入力です。                       | |   キーが押されていなければ0、                    | |   押されていればそのASCIIコードを値とします。          | |                                     | |MODE〔〈式1〉,〈式2〉〕                      | |  ●式1を式2で割った余りを値とします。                | |                                     | |ABS〔〈式〉〕                             | |  ●式が負であれば正の数にします。                   | |   正であれば、それを値とします。                   | |                                     | |SGN〔〈式〉〕                             | |  ●式の符号を値とします。                       | |   式が負であれば−1                         | |   式が0であれば0                          | |   式が正であれば1を値とします。                   | |                                     | |RND〔〈式〉〕                             | |  ●1〜式までの乱数値を値とします。                  | |                                     | |INP〔〈I/O番地〉〕                         | |  ●I/O番地の内容を値とします。                   | |                                     | |ADRS〔〈変数〉〕                           | |  ●変数の格納されているアドレスを値とします。             | |                                     | |PEEK 〔〈式〉〕                           | |  ●式のアドレスのメモリー内容を値とします。              | |                                     | |INC〔〈変数〉〕                            | |  ●変数の値を1つ増加させ、その値を値とします。            | |                                     | |DEC〔〈変数〉〕                            | |  ●変数の値を1つ減少させ、その値を値とします。            | |                                     | |USR〔〈式1〉,〈式2〉〕                       | |  ●式2をHLレジスタに代入した後に、式1のアドレスを         | |   マシン語サブルーチン・コールします。                | |  ●RETURN時のHLの数値を値とします。              | |  ●IX、IYレジスタは変化させてはいけません。            | |                                     | |SPEEK〔〈式X〉,〈式Y〉〕                     | |  ●CRT上の(X,Y)座標にある                   | |   キャラクタのディスプレイ・コードを値とします。           | |                                     | |CP$〔〈式1〉,〈式2〉,〈式3〉〕                  | |  ●文字列比較関数、〈式1〉,〈式2〉は                | |   それぞれ2組の文字列の先頭アドレスを指します。           | |   〈式3〉は比較の最終コードを示し、                 | |   〈式1〉が指す文字列に、このコードが現れたとき           | |   比較を終ります。                          | |   関数値は一致のとき1、不一致のとき、0を値とします。        | |                                     | |CPI〔〈〈式1〉,“文字列”)                     | |  ●式1の値を先頭アドレスとする文字列と                | |   『”』クォーテーション内の文字列と比較します。           | |   関数値は一致したとき1、不一致のとき0を値とします。        | |                                     | |TIME関数                               | |  ●内部のタイマの値を値とします。タイマの値を             | |   セットする場合は、TIME=式とします。              | |   TIMEの単位は秒です。                      | |   BASICのように60進数にフォーマットされません。        | |                                     | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−・ WICS MZ−80K/C版のメモリ・マップ ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・ | $1200・−−−−−−−−−−−−−−・\ −・   | |    | ランタイム・パッケージ  | | |   | |    | マシン語モニタ($1206) | | |   | | $1C00|−−−−−−−−−−−−−−| | |   | |    | PUSHスタック(IY) | | |   | | $1C00|−−−−−−−−−−−−−−| |−・   | |    |■■■■■■■■■■■■■■| |     | |    |■■■■■■■■■■■■■■| |     | |    |■■インタープリタ本体■■■| |     | |    |■■(エディタを含む)■■■| |     | |    |■■■■■■■■■■■■■■| |     | |    |■■■■■■■■■■■■■■| |     | | $3400|−−−−−−−−−−−−−−| |     | |    |  変数名のハッシュ表   | |     | | $3800|−−−−−−−−−−−−−−| |     | |    |↓    変数エリア    | |     | |    |              | |     | |    |↑FOR、GOSUBスタック(IX)| |     | | $4000|−−−−−−−−−−−−−−|/      | |    |↓ WICSテキスト・プログラム  |       | |    |              |       | |    |              |       | |    |              |       | |    |              |       | |    〜              〜       | |    〜              〜       | |    |              |       | | $9800|−−−−−−−−−−−−−−|       | |    |■■WICSコンパイラ■■■|       | |    |■■■■■■■■■■■■■■|       | |    |■■■■■■■■■■■■■■|       | |    |■■■■■■■■■■■■■■|       | |    |■■■■■■■■■■■■■■|       | |    |■■■■■■■■■■■■■■|       | | $BBFF・−−−−−−−−−−−−−−・       | ・−−−−−−−−−−−−−−−−−−−−−−−−−−−・   ・−−−−−−−−−−−−−−・  /      おわりに      \ ・−−−−−−−−−−−−−−−−−−・ 今回は、インタープリタのアセンブル・リストを発表しましたが、 次回は、ベンチ・マーク・テストのような短かいプログラムでも10倍、 コンパイラ自身のような巨大なプログラムでは 50倍以上ものスピードを有するコンパイラを発表しますので、 ご期待ください。 また、このコンパイラを使用した高速ゲームも発表します。 【】参考文献 1)キャリーラボ:“BASE−80”、I/O、’81年4月号